/**
 * 防重复提交工具函数
 */

// 存储提交状态的Map
const submitStatusMap = new Map<string, boolean>()

/**
 * 检查是否可以提交
 * @param key 唯一标识符，用于区分不同的提交操作
 * @returns boolean 是否可以提交
 */
export function canSubmit(key: string): boolean {
  // 如果当前key不存在或为false，表示可以提交
  return !submitStatusMap.get(key)
}

/**
 * 设置提交状态
 * @param key 唯一标识符
 * @param status 提交状态
 */
export function setSubmitStatus(key: string, status: boolean): void {
  submitStatusMap.set(key, status)
}

/**
 * 重置提交状态
 * @param key 唯一标识符
 */
export function resetSubmitStatus(key: string): void {
  submitStatusMap.delete(key)
}

/**
 * 防重复提交装饰器函数
 * @param key 唯一标识符
 * @param fn 要执行的函数
 * @returns Promise<any>
 */
export async function preventDuplicateSubmit<T>(key: string, fn: () => Promise<T>): Promise<T> {
  // 检查是否可以提交
  if (!canSubmit(key)) {
    throw new Error('请勿重复提交')
  }

  // 设置提交状态为true（正在提交中）
  setSubmitStatus(key, true)

  try {
    // 执行提交操作
    const result = await fn()
    return result
  } catch (error) {
    // 如果提交失败，重置提交状态
    resetSubmitStatus(key)
    throw error
  } finally {
    // 提交完成（成功或失败）后，重置提交状态
    resetSubmitStatus(key)
  }
}
